GEO Working Group: Data Working Group (Data-WG)
Subgroup: Data Sharing and Data Management Principles (Data-WG/DSDMP)

This document summmarizes the process and outputs of an analytic approach taken to increase the Data-WG and broader GEO community understanding of the relationship between the GEO Data Sharing (pg 11) and Data Management Principles (pg. 10) (referred to as DSDMP hereafter) and other data lifecycle models and reference principles (referred to as reference frameworks hereafter) that have been developed since the development of the GEO principles as part of the 2016-2025 GEO Strategic Plan. This document presents both a narrative description of the process followed in developing the initial connections between the DSDMP and reference frameworks, and summary visualizations of the preliminary data.

The work presented herein was initiated in July 2021 within the Data-WG/DSDMP through a discussion within the subgroup to identify an initial set of reference frameworks to focus on in the identification of connections between the DSDMP and those reference frameworks. The identification of these connections was intended to serve three purposes:

Reference lifecycles and principles were included in the analysis to both address questions of how the DSDMP relate to the process steps emphasized in lifecycle models, and the more conceptual elements of the reference principles. Through addressing both reference lifecycles and principles we can gain a more holistic assessment of the current relationship between the DSDMP and the community’s broader practice informed by values. The initial set of lifecycles and principles identified by the Data-WG/DSDMP included:

Data Collection

Following the identifcation of the reference frameworks to be used in the analysis a shared Google spreadsheet was developed in which the preliminary mappings between the DSDMP and each of the reference frameworks. The use of the spreadsheet allowed for rapid prototyping of the data model for capturing and organizing the developed mappings. The spreadsheet includes an Instructions worksheet that provides background information about the content and structure of the spreadsheet, a Lifecycles worksheet that provides reference information and labels for each of the selected reference frameworks, a Crosswalk-DataSharingPrinciples worksheet that provides reference information about the individual GEO data sharing principles and the mapping between those principles and the reference frameworks, and a Crosswalk-DataManagementPrinciples worksheet that provides reference information about the GEO data management principles and the mapping between those principles and the reference frameworks.

The tabular structure within the prototype spreadsheet enables streamlined extraction of content of descriptive information about the individual DSDMT and reference frameworks and the identified connections between them.

Analysis

The extraction of data managed in the prototype spreadsheet is accomplished through R code (in the form of the R markdown document used to create this document and other analytic products) that:

Developed Crosswalk Information

The following table summarizes the connections defined thus far between the GEO DSDMP and the reference frameworks.

Visualize some relationships

GEO Data Management Principles - DataONE

GEO Data Management Principles - DataONE GEO Data Management Principles - DataONE GEO Data Management Principles - NSTC

GEO Data Management Principles - DataONE GEO Data Management Principles - DataONE GEO Data Management Principles - EEA

GEO Data Management Principles - DataONE GEO Data Management Principles - DataONE GEO Data Management Principles - NIST

GEO Data Management Principles - DataONE GEO Data Management Principles - DataONE GEO Data Management Principles - FAIR

GEO Data Management Principles - DataONE GEO Data Management Principles - DataONE GEO Data Management Principles - TRUST

GEO Data Management Principles - DataONE GEO Data Management Principles - DataONE GEO Data Management Principles - Reference Frameworks

Next Steps

While the current spreadsheet provides a useful initial platform for capturing and sharing the initial mappings, it does not provide a scalable data structure that will enable streamlined collection of data from multiple contributors, allowing for cross-validation of identified connections. Next steps for work on this project include the following:

Appendix A - Reference Information for the Data Sharing and Data Management Principles

Under development

LS0tCnRpdGxlOiAiTGlua2luZyB0aGUgR0VPIERhdGEgU2hhcmluZyBhbmQgRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgdG8gb3RoZXIgUmVmZXJlbmNlIExpZmVjeWNsZXMgYW5kIFByaW5jaXBsZXMiCmF1dGhvcjogIkthcmwgQmVuZWRpY3QiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVZLSViLSVkJylgIgpvdXRwdXQ6CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0Ci0tLQoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgbG9hZCByZXF1aXJlZCBsaWJyYXJpZXMKbGlicmFyeShnb29nbGVzaGVldHM0KQpsaWJyYXJ5KGdvb2dsZWRyaXZlKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShpZ3JhcGgpCmxpYnJhcnkoZ2dyYXBoKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZmxleHRhYmxlKQoKb3B0cyA8LSBvcHRpb25zKGtuaXRyLmthYmxlLk5BID0gIiIpCmBgYAoKfCAqKkdFTyBXb3JraW5nIEdyb3VwKio6IFtEYXRhIFdvcmtpbmcgR3JvdXAgKERhdGEtV0cpXShodHRwczovL3d3dy5lYXJ0aG9ic2VydmF0aW9ucy5vcmcvZGF0YV93Zy5waHApCnwgKipTdWJncm91cCoqOiAqRGF0YSBTaGFyaW5nIGFuZCBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyogKERhdGEtV0cvRFNETVApCgpUaGlzIGRvY3VtZW50IHN1bW1tYXJpemVzIHRoZSBwcm9jZXNzIGFuZCBvdXRwdXRzIG9mIGFuIGFuYWx5dGljIGFwcHJvYWNoIHRha2VuIHRvIGluY3JlYXNlIHRoZSBEYXRhLVdHIGFuZCBicm9hZGVyIEdFTyBjb21tdW5pdHkgdW5kZXJzdGFuZGluZyBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIEdFTyBbRGF0YSBTaGFyaW5nIChwZyAxMSldKGh0dHBzOi8vd3d3LmVhcnRob2JzZXJ2YXRpb25zLm9yZy9kb2N1bWVudHMvb3Blbl9lb19kYXRhL0dFT19TdHJhdGVnaWNfUGxhbl8yMDE2XzIwMjVfSW1wbGVtZW50aW5nX0dFT1NTX1JlZmVyZW5jZV9Eb2N1bWVudC5wZGYpIGFuZCBbRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgKHBnLiAxMCldKGh0dHBzOi8vd3d3LmVhcnRob2JzZXJ2YXRpb25zLm9yZy9kb2N1bWVudHMvb3Blbl9lb19kYXRhL0dFT19TdHJhdGVnaWNfUGxhbl8yMDE2XzIwMjVfSW1wbGVtZW50aW5nX0dFT1NTX1JlZmVyZW5jZV9Eb2N1bWVudC5wZGYpIChyZWZlcnJlZCB0byBhcyAqRFNETVAqIGhlcmVhZnRlcikgYW5kIG90aGVyIGRhdGEgbGlmZWN5Y2xlIG1vZGVscyBhbmQgcmVmZXJlbmNlIHByaW5jaXBsZXMgKHJlZmVycmVkIHRvIGFzICpyZWZlcmVuY2UgZnJhbWV3b3JrcyogaGVyZWFmdGVyKSB0aGF0IGhhdmUgYmVlbiBkZXZlbG9wZWQgc2luY2UgdGhlIGRldmVsb3BtZW50IG9mIHRoZSBHRU8gcHJpbmNpcGxlcyBhcyBwYXJ0IG9mIHRoZSBbMjAxNi0yMDI1IEdFTyBTdHJhdGVnaWMgUGxhbl0oaHR0cHM6Ly93d3cuZWFydGhvYnNlcnZhdGlvbnMub3JnL2RvY3VtZW50cy9vcGVuX2VvX2RhdGEvR0VPX1N0cmF0ZWdpY19QbGFuXzIwMTZfMjAyNV9JbXBsZW1lbnRpbmdfR0VPU1MucGRmKS4gVGhpcyBkb2N1bWVudCBwcmVzZW50cyBib3RoIGEgbmFycmF0aXZlIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9jZXNzIGZvbGxvd2VkIGluIGRldmVsb3BpbmcgdGhlIGluaXRpYWwgY29ubmVjdGlvbnMgYmV0d2VlbiB0aGUgRFNETVAgYW5kIHJlZmVyZW5jZSBmcmFtZXdvcmtzLCBhbmQgc3VtbWFyeSB2aXN1YWxpemF0aW9ucyBvZiB0aGUgcHJlbGltaW5hcnkgZGF0YS4gCgpUaGUgd29yayBwcmVzZW50ZWQgaGVyZWluIHdhcyBpbml0aWF0ZWQgaW4gSnVseSAyMDIxIHdpdGhpbiB0aGUgRGF0YS1XRy9EU0RNUCB0aHJvdWdoIGEgZGlzY3Vzc2lvbiB3aXRoaW4gdGhlIHN1Ymdyb3VwIHRvIGlkZW50aWZ5IGFuIGluaXRpYWwgc2V0IG9mIHJlZmVyZW5jZSBmcmFtZXdvcmtzIHRvIGZvY3VzIG9uIGluIHRoZSBpZGVudGlmaWNhdGlvbiBvZiBjb25uZWN0aW9ucyBiZXR3ZWVuIHRoZSBEU0RNUCBhbmQgdGhvc2UgcmVmZXJlbmNlIGZyYW1ld29ya3MuIFRoZSBpZGVudGlmaWNhdGlvbiBvZiB0aGVzZSBjb25uZWN0aW9ucyB3YXMgaW50ZW5kZWQgdG8gc2VydmUgdGhyZWUgcHVycG9zZXM6CgoqIElkZW50aWZ5IGdhcHMgaW4gdGhlIGNvdmVyYWdlIGJ5IERTRE1QIGNvbmNlcHRzIG9mIGVsZW1lbnRzIG9mIHRoZSByZWZlcmVuY2UgZnJhbWV3b3JrcwoqIEluZm9ybSBkaXNjdXNzaW9ucyBmb3IgZnVydGhlciBkZXZlbG9wbWVudCBvZiB0aGUgRFNETVAgd2l0aCBzcGVjaWZpYyBpbnNpZ2h0cyBnYWluZWQgZnJvbSB0aGUgcHJvY2VzcyBvZiBnYXAgaWRlbnRpZmljYXRpb24KKiBFbmFibGUgZW5oYW5jZWQgY29tbXVuaWNhdGlvbiBvZiB0aGUgRFNETVAgdG8gYXVkaWVuY2VzIGZhbWlsaWFyIHdpdGggdGhlIHJlZmVyZW5jZSBmcmFtZXdvcmtzIHRocm91Z2ggY29tbXVuaWNhdGlvbiBvZiB0aGUgaWRlbnRpZmllZCBjb25uZWN0aW9ucyBiZXR3ZWVuIHRoZSBmcmFtZXdvcmtzIHdpdGggd2hpY2ggdGhleSBhcmUgZmFtaWxpYXIgYW5kIHRoZSBEU0RNUC4gCgpSZWZlcmVuY2UgbGlmZWN5Y2xlcyBhbmQgcHJpbmNpcGxlcyB3ZXJlIGluY2x1ZGVkIGluIHRoZSBhbmFseXNpcyB0byBib3RoIGFkZHJlc3MgcXVlc3Rpb25zIG9mIGhvdyB0aGUgRFNETVAgcmVsYXRlIHRvIHRoZSBwcm9jZXNzIHN0ZXBzIGVtcGhhc2l6ZWQgaW4gbGlmZWN5Y2xlIG1vZGVscywgYW5kIHRoZSBtb3JlIGNvbmNlcHR1YWwgZWxlbWVudHMgb2YgdGhlIHJlZmVyZW5jZSBwcmluY2lwbGVzLiBUaHJvdWdoIGFkZHJlc3NpbmcgYm90aCByZWZlcmVuY2UgbGlmZWN5Y2xlcyBhbmQgcHJpbmNpcGxlcyB3ZSBjYW4gZ2FpbiBhIG1vcmUgaG9saXN0aWMgYXNzZXNzbWVudCBvZiB0aGUgY3VycmVudCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgRFNETVAgYW5kIHRoZSBjb21tdW5pdHkncyBicm9hZGVyIHByYWN0aWNlIGluZm9ybWVkIGJ5IHZhbHVlcy4gVGhlIGluaXRpYWwgc2V0IG9mIGxpZmVjeWNsZXMgYW5kIHByaW5jaXBsZXMgaWRlbnRpZmllZCBieSB0aGUgRGF0YS1XRy9EU0RNUCBpbmNsdWRlZDoKCiogW05PQUEgRW52aXJvbm1lbnRhbCBEYXRhIE1hbmFnZW1lbnQgRnJhbWV3b3JrXShodHRwczovL25vc2Mubm9hYS5nb3YvRURNQy9mcmFtZXdvcmsucGhwKSAoRURNRiAtIG5vdCB5ZXQgY29tcGxldGVkKQoqIFtVUyBOYXRpb25hbCBTY2llbmNlIGFuZCBUZWNobm9sb2d5IENvdW5jaWwgQ29tbW9uIEZyYW1ld29yayBmb3IgRU8gRGF0YV0oaHR0cHM6Ly91c2dlby5nb3YvdXBsb2Fkcy9jb21tb25fZnJhbWV3b3JrX2Zvcl9lYXJ0aF9vYnNlcnZhdGlvbl9kYXRhLnBkZikgKE5TVEMgLSBwcmVsaW1pbmFyeSBjb25uZWN0aW9ucyBkZWZpbmVkKQoqIFtFdXJvcGVhbiBFbnZpcm9ubWVudCBBZ2VuY3kgRGF0YS9JbmZvcm1hdGlvbiBNYW5hZ2VtZW50IEZyYW1ld29ya10oaHR0cHM6Ly9lbmktc2Vpcy5laW9uZXQuZXVyb3BhLmV1L2Vhc3QvZ292ZXJuYW5jZS9wcm9qZWN0LWRvY3VtZW50cy9lZWEtZGF0YS1pbmZvcm1hdGlvbi1tYW5hZ2VtZW50LWZyYW1ld29yaykKIChFRUEgLSBwcmVsaW1pbmFyeSBjb25uZWN0aW9ucyBkZWZpbmVkKQogKiBbKFVTKSBOYXRpb25hbCBJbnN0aXR1dGUgZm9yIFN0YW5kYXJkcyBhbmQgVGVjaG5vbG9neSBSZXNlYXJjaCBEYXRhIEZyYW1ld29ya10oaHR0cHM6Ly93d3cubmlzdC5nb3Yvc3lzdGVtL2ZpbGVzL2RvY3VtZW50cy8yMDIxLzAxLzI5L1JEYUYlMjBPdmVydmV3JTIwSGFuaXNjaC5wZGYpIChOSVNUIC0gcHJlbGltaW5hcnkgY29ubmVjdGlvbnMgZGVmaW5lZCkKICogW0RhdGFPTkUgRGF0YSBMaWZlY3ljbGVdKGh0dHBzOi8vb2xkLmRhdGFvbmUub3JnL2RhdGEtbGlmZS1jeWNsZSkgKERhdGFPTkUgLSBwcmVsaW1pbmFyeSBjb25uZWN0aW9ucyBkZWZpbmVkKQogKiBbRkFJUiBQcmluY2lwbGVzXShodHRwczovL3d3dy5uYXR1cmUuY29tL2FydGljbGVzL3NkYXRhMjAxNjE4KSAoRkFJUiAtIHByZWxpbWluYXJ5IGNvbm5lY3Rpb25zIGRlZmluZWQpCiAqIFtUUlVTVCBQcmluY2lwbGVzXShodHRwczovL3d3dy5uYXR1cmUuY29tL2FydGljbGVzL3M0MTU5Ny0wMjAtMDQ4Ni03KSAoVFJVU1QgLSBwcmVsaW1pbmFyeSBjb25uZWN0aW9ucyBkZWZpbmVkKQogKiBDQVJFIFByaW5jaXBsZXMgKENBUkUgLSBub3QgeWV0IGNvbXBsZXRlZCkKCgojIyBEYXRhIENvbGxlY3Rpb24KCkZvbGxvd2luZyB0aGUgaWRlbnRpZmNhdGlvbiBvZiB0aGUgcmVmZXJlbmNlIGZyYW1ld29ya3MgdG8gYmUgdXNlZCBpbiB0aGUgYW5hbHlzaXMgYSBzaGFyZWQgW0dvb2dsZSBzcHJlYWRzaGVldF0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMTVGbXcwbTJqeC13S05xeXpCOUFzUmJEZW9rcDlOb3dyWkJkN1hMSFpURWMvZWRpdCNnaWQ9MTcxOTk0OTY0MSkgd2FzIGRldmVsb3BlZCBpbiB3aGljaCB0aGUgcHJlbGltaW5hcnkgbWFwcGluZ3MgYmV0d2VlbiB0aGUgRFNETVAgYW5kIGVhY2ggb2YgdGhlIHJlZmVyZW5jZSBmcmFtZXdvcmtzLiBUaGUgdXNlIG9mIHRoZSBzcHJlYWRzaGVldCBhbGxvd2VkIGZvciByYXBpZCBwcm90b3R5cGluZyBvZiB0aGUgZGF0YSBtb2RlbCBmb3IgY2FwdHVyaW5nIGFuZCBvcmdhbml6aW5nIHRoZSBkZXZlbG9wZWQgbWFwcGluZ3MuIFRoZSBzcHJlYWRzaGVldCBpbmNsdWRlcyBhbiBgSW5zdHJ1Y3Rpb25zYCB3b3Jrc2hlZXQgdGhhdCBwcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250ZW50IGFuZCBzdHJ1Y3R1cmUgb2YgdGhlIHNwcmVhZHNoZWV0LCBhIGBMaWZlY3ljbGVzYCB3b3Jrc2hlZXQgdGhhdCBwcm92aWRlcyByZWZlcmVuY2UgaW5mb3JtYXRpb24gYW5kIGxhYmVscyBmb3IgZWFjaCBvZiB0aGUgc2VsZWN0ZWQgcmVmZXJlbmNlIGZyYW1ld29ya3MsIGEgYENyb3Nzd2Fsay1EYXRhU2hhcmluZ1ByaW5jaXBsZXNgIHdvcmtzaGVldCB0aGF0IHByb3ZpZGVzIHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5kaXZpZHVhbCBHRU8gZGF0YSBzaGFyaW5nIHByaW5jaXBsZXMgYW5kIHRoZSBtYXBwaW5nIGJldHdlZW4gdGhvc2UgcHJpbmNpcGxlcyBhbmQgdGhlIHJlZmVyZW5jZSBmcmFtZXdvcmtzLCBhbmQgYSBgQ3Jvc3N3YWxrLURhdGFNYW5hZ2VtZW50UHJpbmNpcGxlc2Agd29ya3NoZWV0IHRoYXQgcHJvdmlkZXMgcmVmZXJlbmNlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBHRU8gZGF0YSBtYW5hZ2VtZW50IHByaW5jaXBsZXMgYW5kIHRoZSBtYXBwaW5nIGJldHdlZW4gdGhvc2UgcHJpbmNpcGxlcyBhbmQgdGhlIHJlZmVyZW5jZSBmcmFtZXdvcmtzLiAKClRoZSB0YWJ1bGFyIHN0cnVjdHVyZSB3aXRoaW4gdGhlIHByb3RvdHlwZSBzcHJlYWRzaGVldCBlbmFibGVzIHN0cmVhbWxpbmVkIGV4dHJhY3Rpb24gb2YgY29udGVudCBvZiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5kaXZpZHVhbCBEU0RNVCBhbmQgcmVmZXJlbmNlIGZyYW1ld29ya3MgYW5kIHRoZSBpZGVudGlmaWVkIGNvbm5lY3Rpb25zIGJldHdlZW4gdGhlbS4gCgojIyBBbmFseXNpcwoKVGhlIGV4dHJhY3Rpb24gb2YgZGF0YSBtYW5hZ2VkIGluIHRoZSBwcm90b3R5cGUgc3ByZWFkc2hlZXQgaXMgYWNjb21wbGlzaGVkIHRocm91Z2ggUiBjb2RlIChpbiB0aGUgZm9ybSBvZiB0aGUgUiBtYXJrZG93biBkb2N1bWVudCB1c2VkIHRvIGNyZWF0ZSB0aGlzIGRvY3VtZW50IGFuZCBvdGhlciBhbmFseXRpYyBwcm9kdWN0cykgdGhhdDoKCiogUmVhZHMgdGhlIGNvbnRlbnQgb2YgdGhlIGluZGl2aWR1YWwgZGF0YSBjb250YWluaW5nIHdvcmtzaGVldHMKICAqIGBMaWZlY3ljbGVzYAogICogYENyb3Nzd2Fsay1EYXRhU2hhcmluZ1ByaW5jaXBsZXNgCiAgKiBgQ3Jvc3N3YWxrLURhdGFNYW5hZ2VtZW50UHJpbmNpcGxlc2AKKiBFeHRyYWN0cyBhbmQgZm9ybWF0cyB0aGUgZGF0YSBmcm9tIGVhY2ggd29ya3NoZWV0CiogUHJlc2VudHMgdGhlIGV4dHJhY3RlZCBjb25uZWN0aW9uIGluZm9ybWF0aW9uIGluIHRhYnVsYXIgZm9ybQoqIFZpc3VhbGl6ZXMgdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gZm9yIGdyYXBoaWMgaW50ZXJwcmV0YXRpb24KKiBQcmVzZW50cyB0aGUgcmVmZXJlbmNlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBEU0RNUCBhbmQgcmVmZXJlbmNlIGZyYW1ld29ya3MKCgpgYGB7ciwgZWNobz1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0iaGlkZSJ9CiMgQ3Jvc3N3YWxrIGJldHdlZW4gR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIGFuZCBzZWxlY3RlZCBsaWZlY3ljbGVzIGFuZCBwcmluY2lwbGVzCmdzaGVldFVSTCA8LSAiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMTVGbXcwbTJqeC13S05xeXpCOUFzUmJEZW9rcDlOb3dyWkJkN1hMSFpURWMvZWRpdCNnaWQ9MTcxOTk0OTY0MSIKZ3NoZWV0U2hhcmluZ1dvcmtzaGVldCA8LSAiQ3Jvc3N3YWxrLURhdGFTaGFyaW5nUHJpbmNpcGxlcyIKZ3NoZWV0TWFuYWdlbWVudFdvcmtzaGVldCA8LSAiQ3Jvc3N3YWxrLURhdGFNYW5hZ2VtZW50UHJpbmNpcGxlcyIKCmdzNF9kZWF1dGgoKSAjIGRpc2FibGUgYXV0aGVudGljYXRpb24gcmVxdWlyZW1lbnRzIGZvciB0aGlzIHB1YmxpYyBzaGVldAoKIyBnZXQgdGhlIHNoZWV0IGlkcyBmcm9tIHRoZSBnb29nbGUgc2hlZXQgdXJsCnNzaWQgPC0gYXNfc2hlZXRzX2lkKGdzaGVldFVSTCkKdW5jbGFzcyhzc2lkKQoKIyByZXRyaWV2ZSB0aGUgYmFzZSBzaGVldCBjb250ZW50CmxpZmVjeWNsZXMgPC0gcmVhZF9zaGVldChzc2lkLCBzaGVldCA9ICJMaWZlY3ljbGVzIiwgc2tpcCA9IDEsIG5hID0gYygiLSIsICIiKSkKZG1wX2Nyb3Nzd2FsayA8LSByZWFkX3NoZWV0KHNzaWQsIHNoZWV0ID0gIkNyb3Nzd2Fsay1EYXRhTWFuYWdlbWVudFByaW5jaXBsZXMiKQpkc3BfY3Jvc3N3YWxrIDwtIHJlYWRfc2hlZXQoc3NpZCwgc2hlZXQgPSAiQ3Jvc3N3YWxrLURhdGFTaGFyaW5nUHJpbmNpcGxlcyIpCgojIGV4dHJhY3Qgbm9kZXMgCm5fbGlmZWN5Y2xlcyA8LSBsaWZlY3ljbGVzICU+JSAKICBzZWxlY3QobWF0Y2hlcygiLWNvbWJvJCIpKSAlPiUgCiAgZ2F0aGVyKCkgJT4lIAogIGZpbHRlcighaXMubmEodmFsdWUpKSAlPiUgCiAgZGlzdGluY3QodmFsdWUpICU+JSAKICBtdXRhdGUobGFiZWwgPSBzdHJfc3BsaXQodmFsdWUsICItIiwgc2ltcGxpZnkgPSBGQUxTRSwgbiA9IDMpKSAlPiUgCiAgc2VsZWN0KGxhYmVsKQoKbl9kbXAgPC0gZG1wX2Nyb3Nzd2FsayAlPiUgCiAgZmlsdGVyKCFpcy5uYShEYXRhTWFuYWdlbWVudFByaW5jaXBsZSkpICU+JSAKICBkaXN0aW5jdChEYXRhTWFuYWdlbWVudFByaW5jaXBsZSkgJT4lIAogIG11dGF0ZShsYWJlbCA9IERhdGFNYW5hZ2VtZW50UHJpbmNpcGxlKSAlPiUgCiAgc2VsZWN0KGxhYmVsKQoKbl9hbGwgPC0gbl9saWZlY3ljbGVzICU+JSAKICByb3d3aXNlKCkgJT4lIAogIG11dGF0ZSh0eXBlID0gY2FzZV93aGVuKGxhYmVsWzFdID09ICJUUlVTVCIgfiAicHJpbmNpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFsxXSA9PSAiRkFJUiIgfiAicHJpbmNpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFsxXSA9PSAiRGF0YU9ORSIgfiAibGlmZWN5Y2xlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFsxXSA9PSAiTklTVCIgfiAibGlmZWN5Y2xlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFsxXSA9PSAiRUVBIiB+ICJsaWZlY3ljbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsWzFdID09ICJEYXRhT05FIiB+ICJsaWZlY3ljbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsWzFdID09ICJOU1RDIiB+ICJsaWZlY3ljbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsWzFdID09ICJEYXRhT05FIiB+ICJsaWZlY3ljbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsWzFdID09ICJFRE1GIiB+ICJsaWZlY3ljbGUiKSkgJT4lIAogIG11dGF0ZSgKICAgIGtleSA9IHBhc3RlKGxhYmVsWzFdLCBsYWJlbFsyXSwgc2VwID0gIi0iKSwgCiAgICBzb3VyY2UgPSBsYWJlbFsxXSwKICAgIHNob3J0X2xhYmVsID0ga2V5LCAKICAgIGxhYmVsID0gcGFzdGUocGFzdGUobGFiZWxbMV0sIGxhYmVsWzJdLCBzZXAgPSAiLSIpLCBsYWJlbFszXSwgc2VwID0gIjogIiksCiAgICBub2RlX2xhYmVsID0gbGFiZWwpICU+JSAKICByYmluZChtdXRhdGUobl9kbXAsCiAgICAgICAgICAgICAgIGtleSA9IHNhcHBseShzdHJzcGxpdChsYWJlbCwgIjoiKSwgIltbIiwgMSksCiAgICAgICAgICAgICAgIHNob3J0X2xhYmVsID0ga2V5LCAKICAgICAgICAgICAgICAgbm9kZV9sYWJlbCA9IGxhYmVsLCAKICAgICAgICAgICAgICAgdHlwZSA9ICJHRU8tUHJpbmNpcGxlIiwKICAgICAgICAgICAgICAgc291cmNlID0gIkdFTyIpKSAlPiUgCiAgc2VsZWN0KGtleSwgc2hvcnRfbGFiZWwsIG5vZGVfbGFiZWwsIHNvdXJjZSwgdHlwZSkKICAKCmVfZG1wX2xpZmVjeWNsZSA8LSB0aWJibGUoImZyb20iID0gY2hhcmFjdGVyKCksICJ0byIgPSBjaGFyYWN0ZXIoKSkKZG1wX2Zyb20gPC0gZG1wX2Nyb3Nzd2FsayREYXRhTWFuYWdlbWVudFByaW5jaXBsZQpkbXBfdG8gPC0gZG1wX2Nyb3Nzd2FsayAlPiUgc2VsZWN0KC1EYXRhTWFuYWdlbWVudFByaW5jaXBsZSwgLVByaW5jaXBsZURlc2NyaXB0aW9uKQoKZm9yIChpIGluIHNlcV9hbG9uZyhkbXBfdG8pKSB7CiAgb3V0X3RvIDwtIGRtcF90b1tbaV1dCiAgb3V0X2NvbWJpbmVkIDwtIGJpbmRfY29scyhkbXBfZnJvbSwgb3V0X3RvKQogIGVfZG1wX2xpZmVjeWNsZSA8LSByYmluZChlX2RtcF9saWZlY3ljbGUsb3V0X2NvbWJpbmVkKQp9CgplX2RtcF9saWZlY3ljbGUgPC0gZV9kbXBfbGlmZWN5Y2xlICU+JSAKICByZW5hbWUoZnJvbSA9IDEsIHRvID0gMikgJT4lIAogIGZpbHRlcighaXMubmEodG8pKSAlPiUgCiAgbXV0YXRlKGxpZmVjeWNsZSA9IHN0cl9zcGxpdCh0bywgIi0iLCBzaW1wbGlmeSA9IFRSVUUpLAogICAgICAgICBmcm9tID0gc2FwcGx5KHN0cnNwbGl0KGZyb20sICI6IiksICJbWyIsIDEpLCkKCm5fZG1wX2xpZmVjeWNsZSA8LSBlX2RtcF9saWZlY3ljbGUgJT4lIAogIHNlbGVjdChmcm9tLCB0bykgJT4lIAogIGdhdGhlcigpICU+JSAKICBzZWxlY3QodmFsdWUpICU+JSAKICBkaXN0aW5jdCh2YWx1ZSkKCmBgYAoKIyMjIERldmVsb3BlZCBDcm9zc3dhbGsgSW5mb3JtYXRpb24KClRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgY29ubmVjdGlvbnMgZGVmaW5lZCB0aHVzIGZhciBiZXR3ZWVuIHRoZSBHRU8gRFNETVAgYW5kIHRoZSByZWZlcmVuY2UgZnJhbWV3b3Jrcy4gCgpgYGB7ciwgZWNobz1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KZG1wX2Nyb3Nzd2Fsa1tjKDEsNCw1LDYsNyw4LDkpXSAlPiUgCiAgcWZsZXh0YWJsZSgpICU+JSAKICBzZXRfaGVhZGVyX2xhYmVscygKICAgIHZhbHVlcyA9IGxpc3QoRGF0YU1hbmFnZW1lbnRQcmluY2lwbGUgPSAiRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZSIsCiAgICAgICAgICAgICAgICAgICJMaWZlY3ljbGUtRURNRiIgPSAiRURNRiIsCiAgICAgICAgICAgICAgICAgICJMaWZlY3ljbGUtTlNUQyIgPSAiTlNUQyIsCiAgICAgICAgICAgICAgICAgICJMaWZlY3ljbGUtRUVBIiA9ICJFRUEiLAogICAgICAgICAgICAgICAgICAiTGlmZWN5Y2xlLU5JU1QiID0gIk5JU1QiLAogICAgICAgICAgICAgICAgICAiTGlmZWN5Y2xlLURhdGFPTkUiID0gIkRhdGFPTkUiLAogICAgICAgICAgICAgICAgICAiUHJpbmNpcGxlLUZBSVIiID0gIkZBSVIiLAogICAgICAgICAgICAgICAgICAiUHJpbmNpcGxlLVRSVVNUIiA9ICJUUlVTVCIpKSAlPiUgCiAgZm9udHNpemUoc2l6ZSA9IDcsIHBhcnQgPSAiYm9keSIpICU+JSAKICBmaXRfdG9fd2lkdGgobWF4X3dpZHRoID0gNi41LCB1bml0ID0gImluIikKYGBgCiMjIFZpc3VhbGl6ZSBzb21lIHJlbGF0aW9uc2hpcHMKCmBgYHtyLCBlY2hvPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQojIGNpcmN1bGFyIHBsb3QgMXgxIGZ1bmNpdG9uCmdlb194X3NpbmdsZSA8LSBmdW5jdGlvbih0aXRsZSwgdG9fbm9kZXMsIG91dHB1dF9maWxlKSB7CiAgZWRnZXMgPC0gZmlsdGVyKGVfZG1wX2xpZmVjeWNsZSwgbGlmZWN5Y2xlWywxXSA9PSB0b19ub2RlcykKICAjcHJpbnQoZWRnZXMpCiAgdmVydGljZXMgPC0gZmlsdGVyKG5fYWxsLCAoc291cmNlID09IHRvX25vZGVzIHwgc291cmNlID09ICJHRU8iKSkKICAjcHJpbnQodmVydGljZXMpCiAgZ3JhcGggPC0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKAogICAgZCA9IGVkZ2VzLAogICAgdmVydGljZXMgPSB2ZXJ0aWNlcywKICAgIGRpcmVjdGVkID0gVFJVRSkKICB4eSA8LSBsYXlvdXRfKGdyYXBoLGluX2NpcmNsZSgpKQogIGNpcmN1bGFyX3Bsb3QgPC0gZ2dyYXBoKGdyYXBoLCBsYXlvdXQgPSAibGluZWFyIiwgY2lyY3VsYXIgPSBUUlVFKSArCiAgICBjb29yZF9maXhlZCgpICsKICAgIGdlb21fZWRnZV9saW5rMCh3aWR0aCA9IC4xKSArCiAgICBnZW9tX25vZGVfcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHNvdXJjZSkpLCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogICAgZ2VvbV9ub2RlX2xhYmVsKGFlcyhsYWJlbCA9IHNob3J0X2xhYmVsLCAKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBhcy5mYWN0b3Ioc291cmNlKSksIAogICAgICAgICAgICAgICAgICAgIGxhYmVsLnNpemUgPSAwLAogICAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKICAgIHhsaW0oLTEuMSwgMS4xKSArCiAgICB5bGltKC0xLjEsIDEuMSkgKwogICAgZ2d0aXRsZSh0aXRsZSkgKwogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpCiAgZ2dzYXZlKHBhc3RlKCJpbWFnZXMvY2lyY3VsYXJfIiwgb3V0cHV0X2ZpbGUsIHNlcCA9ICIiKSwgcGxvdCA9IGNpcmN1bGFyX3Bsb3QsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSwgZHBpID0gNjAwKQogIAogICBkZWZhdWx0X3Bsb3QgPC0gZ2dyYXBoKGdyYXBoKSArCiAgICBnZW9tX2VkZ2VfbGluazAod2lkdGggPSAuMSkgKwogICAgZ2VvbV9ub2RlX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3Rvcihzb3VyY2UpKSwgc2l6ZSA9IDEsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICAgIGdlb21fbm9kZV9sYWJlbChhZXMobGFiZWwgPSBzaG9ydF9sYWJlbCwgCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gYXMuZmFjdG9yKHNvdXJjZSkpLCAKICAgICAgICAgICAgICAgICAgICBsYWJlbC5zaXplID0gMCwKICAgICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgICBnZ3RpdGxlKHRpdGxlKSArCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkKICBnZ3NhdmUocGFzdGUoImltYWdlcy9hdXRvXyIsIG91dHB1dF9maWxlLCBzZXAgPSAiIiksIHBsb3QgPSBkZWZhdWx0X3Bsb3QsIHdpZHRoID0xMiwgaGVpZ2h0ID0xMiwgZHBpID0gNjAwKQogIAogICNmaWd1cmVzIDwtIGMocGFzdGUoIi4vaW1hZ2VzL2NpcmN1bGFyXyIsIG91dHB1dF9maWxlLCBzZXAgPSAiIiksIHBhc3RlKCIuL2ltYWdlcy9hdXRvXyIsIG91dHB1dF9maWxlLCBzZXAgPSAiIikpCiAgI3JldHVybihmaWd1cmVzKQp9CmBgYAoKR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gRGF0YU9ORQoKYGBge3IsIGVjaG89RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9Cmdlb194X3NpbmdsZSgKICAiR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIE1hcHBlZCB0byBEYXRhT05FIExpZmVjeWNsZSBFbGVtZW50cyIsCiAgIkRhdGFPTkUiLCAKICAiZGF0YW9uZS5wbmciKQpgYGAKCiFbR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gRGF0YU9ORV0oaW1hZ2VzL2NpcmN1bGFyX2RhdGFvbmUucG5nKQohW0dFTyBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyAtIERhdGFPTkVdKGltYWdlcy9hdXRvX2RhdGFvbmUucG5nKQpcbmV3cGFnZQpHRU8gRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgLSBOU1RDCgpgYGB7ciwgZWNobz1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KZ2VvX3hfc2luZ2xlKAogICJHRU8gRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgTWFwcGVkIHRvIE5TVEMgTGlmZWN5Y2xlIEVsZW1lbnRzIiwKICAiTlNUQyIsIAogICJuc3RjLnBuZyIpCmBgYAoKIVtHRU8gRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgLSBEYXRhT05FXShpbWFnZXMvY2lyY3VsYXJfbnN0Yy5wbmcpCiFbR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gRGF0YU9ORV0oaW1hZ2VzL2F1dG9fbnN0Yy5wbmcpClxuZXdwYWdlCkdFTyBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyAtIEVFQQoKYGBge3IsIGVjaG89RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9Cmdlb194X3NpbmdsZSgKICAiR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIE1hcHBlZCB0byBFRUEgTGlmZWN5Y2xlIEVsZW1lbnRzIiwKICAiRUVBIiwgCiAgImVlYS5wbmciKQpgYGAKCiFbR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gRGF0YU9ORV0oaW1hZ2VzL2NpcmN1bGFyX2VlYS5wbmcpCiFbR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gRGF0YU9ORV0oaW1hZ2VzL2F1dG9fZWVhLnBuZykKXG5ld3BhZ2UKR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gTklTVAoKYGBge3IsIGVjaG89RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9Cmdlb194X3NpbmdsZSgKICAiR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIE1hcHBlZCB0byBOSVNUIExpZmVjeWNsZSBFbGVtZW50cyIsCiAgIk5JU1QiLCAKICAibmlzdC5wbmciKQpgYGAKCiFbR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gRGF0YU9ORV0oaW1hZ2VzL2NpcmN1bGFyX25pc3QucG5nKQohW0dFTyBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyAtIERhdGFPTkVdKGltYWdlcy9hdXRvX25pc3QucG5nKQpcbmV3cGFnZQpHRU8gRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgLSBGQUlSCgpgYGB7ciwgZWNobz1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KZ2VvX3hfc2luZ2xlKAogICJHRU8gRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgTWFwcGVkIHRvIEZBSVIgUHJpbmNpcGxlcyBFbGVtZW50cyIsCiAgIkZBSVIiLCAKICAiZmFpci5wbmciKQpgYGAKCiFbR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gRGF0YU9ORV0oaW1hZ2VzL2NpcmN1bGFyX2ZhaXIucG5nKQohW0dFTyBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyAtIERhdGFPTkVdKGltYWdlcy9hdXRvX2ZhaXIucG5nKQpcbmV3cGFnZQpHRU8gRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgLSBUUlVTVAoKYGBge3IsIGVjaG89RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9Cmdlb194X3NpbmdsZSgKICAiR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIE1hcHBlZCB0byBUUlVTVCBQcmluY2lwbGVzIEVsZW1lbnRzIiwKICAiVFJVU1QiLCAKICAidHJ1c3QucG5nIikKYGBgCgohW0dFTyBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyAtIERhdGFPTkVdKGltYWdlcy9jaXJjdWxhcl90cnVzdC5wbmcpCiFbR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gRGF0YU9ORV0oaW1hZ2VzL2F1dG9fdHJ1c3QucG5nKQpcbmV3cGFnZQpHRU8gRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgLSBSZWZlcmVuY2UgRnJhbWV3b3JrcwoKYGBge3IsIGVjaG89RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiMgY29tYmluZWQgZ3JhcGggZm9yIGFsbCBwcmluY2lwbGVzCmdyYXBoIDwtIGdyYXBoX2Zyb21fZGF0YV9mcmFtZSgKICAgIGQgPSBmaWx0ZXIoZV9kbXBfbGlmZWN5Y2xlLCAobGlmZWN5Y2xlID09ICJGQUlSIiB8IGxpZmVjeWNsZSA9PSAiVFJVU1QiKSApLAogICAgdmVydGljZXMgPSBmaWx0ZXIobl9hbGwsIChzb3VyY2UgPT0gIkZBSVIiIHwgc291cmNlID09ICJUUlVTVCIgfCBzb3VyY2UgPT0gIkdFTyIpICksCiAgICBkaXJlY3RlZCA9IEZBTFNFKQogIHh5IDwtIGxheW91dF8oZ3JhcGgsaW5fY2lyY2xlKCkpCiAgZ2dyYXBoKGdyYXBoLCBsYXlvdXQgPSAibGluZWFyIiwgY2lyY3VsYXIgPSBUUlVFKSArCiAgICBjb29yZF9maXhlZCgpICsKICAgIGdlb21fZWRnZV9saW5rMChhZXMoY29sb3IgPSBsaWZlY3ljbGUpLCB3aWR0aCA9IDEpICsKICAgIGdlb21fbm9kZV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3Ioc291cmNlKSksIHNpemUgPSAxLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgICBnZW9tX25vZGVfbGFiZWwoYWVzKGxhYmVsID0gc2hvcnRfbGFiZWwsIAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGFzLmZhY3Rvcihzb3VyY2UpKSwgCiAgICAgICAgICAgICAgICAgICAgbGFiZWwuc2l6ZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogICAgeGxpbSgtMS4xLCAxLjEpICsKICAgIHlsaW0oLTEuMSwgMS4xKSArCiAgICBnZ3RpdGxlKCJDcm9zc3dhbGsgb2YgR0VPLCBGQUlSLCBhbmQgVFJVU1QgcHJpbmNpcGxlcyIpICsKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQogIGdnc2F2ZShwYXN0ZSgiaW1hZ2VzL2NpcmN1bGFyXyIsInByaW5jaXBsZXMucG5nIiwgc2VwID0gIiIpLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSAxMiwgZHBpID0gNjAwKQoKYGBgCgoKYGBge3IsIGVjaG89RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiAgZ2dyYXBoKGdyYXBoKSArCiAgICBjb29yZF9maXhlZCgpICsKICAgIGdlb21fZWRnZV9saW5rMChhZXMoY29sb3IgPSBsaWZlY3ljbGUpLCB3aWR0aCA9IDEpICsKICAgIGdlb21fbm9kZV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3Ioc291cmNlKSksIHNpemUgPSAxLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgICBnZW9tX25vZGVfbGFiZWwoYWVzKGxhYmVsID0gc2hvcnRfbGFiZWwsIAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGFzLmZhY3Rvcihzb3VyY2UpKSwgCiAgICAgICAgICAgICAgICAgICAgbGFiZWwuc2l6ZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogICAgZ2d0aXRsZSgiQ3Jvc3N3YWxrIG9mIEdFTywgRkFJUiwgYW5kIFRSVVNUIHByaW5jaXBsZXMiKSArCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkKICBnZ3NhdmUocGFzdGUoImltYWdlcy9hdXRvXyIsInByaW5jaXBsZXMucG5nIiwgc2VwID0gIiIpLCB3aWR0aCA9IDE4LCBoZWlnaHQgPSAxOCwgZHBpID0gNjAwKQpgYGAKCgpgYGB7ciwgZWNobz1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KI2dyYXBoIDwtIGdyYXBoX2Zyb21fZGF0YV9mcmFtZSgKIyAgZCA9IGVfZG1wX2xpZmVjeWNsZSwKIyAgdmVydGljZXMgPSBuX2FsbCwKIyAgZGlyZWN0ZWQgPSBGQUxTRSkKIwpgYGAKClxuZXdwYWdlCiMjIE5leHQgU3RlcHMKCldoaWxlIHRoZSBjdXJyZW50IHNwcmVhZHNoZWV0IHByb3ZpZGVzIGEgdXNlZnVsIGluaXRpYWwgcGxhdGZvcm0gZm9yIGNhcHR1cmluZyBhbmQgc2hhcmluZyB0aGUgaW5pdGlhbCBtYXBwaW5ncywgaXQgZG9lcyBub3QgcHJvdmlkZSBhIHNjYWxhYmxlIGRhdGEgc3RydWN0dXJlIHRoYXQgd2lsbCBlbmFibGUgc3RyZWFtbGluZWQgY29sbGVjdGlvbiBvZiBkYXRhIGZyb20gbXVsdGlwbGUgY29udHJpYnV0b3JzLCBhbGxvd2luZyBmb3IgY3Jvc3MtdmFsaWRhdGlvbiBvZiBpZGVudGlmaWVkIGNvbm5lY3Rpb25zLiBOZXh0IHN0ZXBzIGZvciB3b3JrIG9uIHRoaXMgcHJvamVjdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6CgoqIFRyYW5zaXRpb25pbmcgdG8gYSBkYXRhIG1vZGVsIHRoYXQgd2lsbCBlbmFibGUgY2FwdHVyZSBhbmQgbWFuYWdlbWVudCBvZiBjb25uZWN0aW9uIGluZm9ybWF0aW9uIGZyb20gbXVsdGlwbGUgY29udHJpYnV0b3JzIC0gZW5hYmxpbmcgY3Jvc3MgdmFsaWRhdGlvbiBvZiBpZGVudGlmaWVkIGNvbm5lY3Rpb25zLgoqIEV4cGFuc2lvbiBvZiB0aGUgZGF0YSBtb2RlbCB0byBjYXB0dXJlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuYXR1cmUgb2YgdGhlIGNvbm5lY3Rpb25zCiogRGV2ZWxvcCBhbiBvbmxpbmUgZGFzaGJvYXJkIHRoYXQgcHJvdmlkZXMgY3VycmVudCBjb25uZWN0aW9uIGluZm9ybWF0aW9uIGJhc2VkIHVwb24gY29tbXVuaXR5IGNvbnRyaWJ1dGVkIGRhdGEKKiBQdWJsaXNoIHRoZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcyBpbiBvbmUgb3IgbW9yZSBFYXJ0aCBTY2llbmNlIGRhdGEgcHVibGljYXRpb24gdmVudWVzCgoKIyMgQXBwZW5kaXggQSAtIFJlZmVyZW5jZSBJbmZvcm1hdGlvbiBmb3IgdGhlIERhdGEgU2hhcmluZyBhbmQgRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMKClVuZGVyIGRldmVsb3BtZW50Cg==